package com.llk.MyThread;

import java.util.concurrent.TimeUnit;

public class ThreadPoolTest {

    public static void main(String[] args) throws InterruptedException {
        // 创建一个线程池，核心线程数为2，最大线程数为4，非核心线程存活时间为1000ms，队列容量为10
        MyThreadPool threadPool = new MyThreadPool(2, 4, 1000, 10);

        // 测试1：提交多个短任务，观察线程池的并发能力
        System.out.println("测试1：提交多个短任务");
        for (int i = 0; i < 20; i++) {
            int taskId = i;
            threadPool.execute(() -> {
                System.out.println("任务 " + taskId + " 正在由线程 " + Thread.currentThread().getName() + " 执行");
                try {
                    TimeUnit.MILLISECONDS.sleep(500); // 模拟任务执行时间
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

        // 等待一段时间，确保任务执行完毕
        TimeUnit.SECONDS.sleep(10);

        // 测试2：提交长任务，观察线程池的扩展性
        System.out.println("\n测试2：提交长任务");
        for (int i = 0; i < 5; i++) {
            int taskId = i;
            threadPool.execute(() -> {
                System.out.println("长任务 " + taskId + " 正在由线程 " + Thread.currentThread().getName() + " 执行");
                try {
                    TimeUnit.SECONDS.sleep(3); // 模拟长时间任务
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

        // 等待一段时间，确保任务执行完毕
        TimeUnit.SECONDS.sleep(15);

        // 测试3：提交超出队列容量的任务，观察线程池的行为
        System.out.println("\n测试3：提交超出队列容量的任务");
        for (int i = 0; i < 15; i++) {
            int taskId = i;
            try {
                threadPool.execute(() -> {
                    System.out.println("任务 " + taskId + " 正在由线程 " + Thread.currentThread().getName() + " 执行");
                    try {
                        TimeUnit.MILLISECONDS.sleep(500); // 模拟任务执行时间
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                });
            } catch (InterruptedException e) {
                System.out.println("任务 " + taskId + " 被拒绝提交");
            }
        }

        // 等待一段时间，确保任务执行完毕
        TimeUnit.SECONDS.sleep(10);

        // 测试4：关闭线程池，观察是否能优雅关闭
        System.out.println("\n测试4：关闭线程池");
        threadPool.shutdown();
        System.out.println("线程池已关闭");
    }
}